package proceso.busqueda;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import modelo.pozo.PozoProduccion;

/**
 * 
 * @author edgar
 * Consigue los pozos mas cercanos a un punto dentro de un radio dado
 */
public class RecuperarPozosVecinos {
	private List<PozoProduccion> pozosVecinosActivos = new ArrayList<PozoProduccion>();
	private List<PozoProduccion> totalPozos = new ArrayList<PozoProduccion>();
	
	public List<PozoProduccion> getPozosVecinosActivos() {
		return pozosVecinosActivos;
	}

	public void setPozosVecinosActivos(List<PozoProduccion> pozosVecinosActivos) {
		this.pozosVecinosActivos = pozosVecinosActivos;
	}

	public List<PozoProduccion> getTotalPozos() {
		return totalPozos;
	}

	public void setTotalPozos(List<PozoProduccion> totalPozos) {
		this.totalPozos = totalPozos;
	}

	/**
	 * 
	 * @param sess Seesion de hibernate para poder hacer la consulta
	 * @param este coordenada del punto
	 * @param norte coordinada del punto
	 * @return validez del resultado
	 */
	public boolean buscar(Session sess, double este, double norte, double distanciaMax) {
		double distancia, difEste, difNorte;
		List<PozoProduccion> listaRecuperada;
		Query q;
		q = sess.createQuery("from PozoProduccion as p where p.operativo = 1");
		listaRecuperada = q.list();
		for(int i=0; i<listaRecuperada.size(); i++) {
			difEste = listaRecuperada.get(i).getEste() - este;
			difNorte = listaRecuperada.get(i).getNorte() - norte;
			distancia = Math.sqrt((difNorte * difNorte) +(difEste*difEste));
			if(distancia < distanciaMax) {
				pozosVecinosActivos.add(listaRecuperada.get(i));
			}
		}
		q = sess.createQuery("from PozoProduccion");
		listaRecuperada = q.list();
		for(int i=0; i<listaRecuperada.size(); i++) {
			difEste = listaRecuperada.get(i).getEste() - este;
			difNorte = listaRecuperada.get(i).getNorte() - norte;
			distancia = Math.sqrt((difNorte * difNorte) +(difEste*difEste));
			if(distancia < distanciaMax) {
				totalPozos.add(listaRecuperada.get(i));
			}
		}
				
		return true;
	}
	
}
